<?
include_once(CONFIG_DOCUMENT_ROOT.'includes/lib/core.class.php');

class View extends Core {

	private $view = null;
	public $autorender = true;
	private $data = null;

	function __construct ($view=null) {
		parent::__construct();
		if ($view)
			$this->_view($view);
	}

	function exists ($view=null) {

		$view = ($view)? $view : $this->_view();

		return is_file($this->get_path($view));
	}

	function _view ($view) {
		$this->view = $view;
	}

	function data ($data) {
		$this->data = $data;
	}

	function get_path ($view=null) {

		$view = ($view)? $view : $this->_view();

		$this->load->template();

		return CONFIG_DOCUMENT_ROOT.'includes/templates/'.$this->load->template->template().'/views/'.$view.'.tpl';
	}

	function display ($data=null, $view=null) {

		$view = ($view)? $view : $this->view;

		if (!$data)
			$data = $this->data;
		
		if (!$view)
			return false;

		if (!$this->exists($view))
			$view = preg_replace('/^([^\/]+)(.*)/i', 'scaffold\\2', $view);

		$tpl = $this->get_path($view);
		
		// Esta seteado el autorender, lo incluyo y retorno
		if ($this->autorender)
			return include($tpl);

		// No tiene autorender, devuelvo el string del tpl
		ob_start();
		if (!include($tpl))
			return false;
		$contents = ob_get_contents();
		ob_end_clean();
		return $contents;

	}

	public function replace($data, $tpl) {

		// Minimizo apenas el tpl sacandole los enters
		$tpl = str_replace(array("\r\n", "\n"), '', $tpl);

		############### Begin Reemplazo de comentarios ###############
		$tpl = preg_replace('/\{\*.+?\*\}/', '', $tpl);
		################ End Reemplazo de comentarios ################

		############### Begin foreach ###############
		$pattern = '/\{foreach(.+?)\}(.+?)\{\/foreach\}/';
		if (preg_match_all($pattern, $tpl, $matches)) {
			for ($i = 0; $i < count($matches[0]); $i++) {
				$nodo = '';
				preg_match('/from\=\$([^ \}$]+)/', $matches[1][$i], $_from); $from = $_from[1];
				preg_match('/item\=\$([^ \}$]+)/', $matches[1][$i], $_item); $item = $_item[1];
				foreach ($data[$from] as $cur) {
						$nodo .= preg_replace('/\{\$'.$item.'\.([^\}]+)\}/e', '\$cur[\'\\1\']', $matches[2][$i]);
				}
				$tpl = preg_replace('/\{foreach.+?'.$item.'.+?\}(.+?)\{\/foreach\}/', $nodo, $tpl);
			}
		}
		################ End foreach ################

		############### Begin Reemplazo de variables ###############
		$tpl = preg_replace('/\{\$(.+?)\}/e', '\$data[\'\\1\']', $tpl);
		################ End Reemplazo de variables ################

		############### Begin Reemplazo de variables ###############
		$tpl = preg_replace('/\$([^ ]+)/e', '(isset($data[\'\\1\'])? $data[\'\\1\'] : \'$\'.\'\\1\')', $tpl);
		################ End Reemplazo de variables ################

		############### Begin if ###############
		$pattern_if = '/\{if(.+?)\}(.+?)\{\/if\}/';
		if (preg_match_all($pattern_if, $tpl, $matches)) {
			for ($i = 0, $codes=array(); $i < count($matches[0]); $i++) {

				// Genero una key para el array codes
				$key = md5($matches[2][$i]);

				// Quito el else si es que tiene y lo almaceno
				list($matches[2][$i], $else) = preg_split('/\{else\}/', $matches[2][$i], -1, $count);

				// Obtengo todos los elseif (condicion y codigo) y el codigo de la primer condicion (if principal)
				$pattern_split = '/\{elseif(.+?)\}/';
				$elseifs = preg_split($pattern_split, $matches[2][$i], -1, PREG_SPLIT_DELIM_CAPTURE);

				// Inicializo el array con el primero que siempre esta
				$ifs = array(array('condition' => $matches[1][$i], 'code' => $elseifs[0]));

				// Proceso los elseifs
				for ($j = 1; $j < count($elseifs); $j+=2) {
					$ifs[] = array('condition' => $elseifs[$j], 'code' => $elseifs[$j+1]);
				}

				// Recorro las condiciones y me quedo con el codigo que de verdadero
				for ($j = 0;($j < count($ifs)) && !$this->evalCondition($ifs[$j]['condition']); $j++);
				$code = ($ifs[$j])? $ifs[$j]['code'] : null;

				// Si no hay code y hay else, tomo ese code
				$codes[$key] = (!$code && $else)? $else : $code;
			}

			// Reemplazo todo el if por el code
			$tpl = preg_replace('/(\{if.+?\})(.+?)(\{\/if\})/e', '$codes[md5(\'\\2\')]', $tpl);

		}
		############### End if ###############

		return $tpl;
	}

	private function evalCondition ($condition) {
		return eval("return ($condition)? true : false;");
	}

}

?>
